package com.company.common.server.aes;

import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import java.io.UnsupportedEncodingException;
import java.security.Key;
import java.security.SecureRandom;

public class DesTool {

    Key key;
    String keyStr;
    public DesTool(){
        keyStr = "mufo110";
        this.setKey("mufo110");
    }
    public void setKey(String strKey) {

        try {

            KeyGenerator _generator = KeyGenerator.getInstance("DES");
            SecureRandom secureRandom = SecureRandom.getInstance("SHA1PRNG");
            secureRandom.setSeed(strKey.getBytes());

            _generator.init(secureRandom);

            this.key = _generator.generateKey();

            _generator = null;

        } catch (Exception e) {

            e.printStackTrace();

        }

    }

    /**

     * 加密String明文输入,String密文输出

     */

    public String getEncString(String strMing) {

        String strMi = "";

        try {
            strMing = java.net.URLEncoder.encode(strMing, "UTF-8");
            strMi =  byte2hex(getEncCode(strMing.getBytes()));

        } catch (Exception e) {

            e.printStackTrace();

        }

        return strMi;

    }

    /** 解密 以String密文输入,String明文输出

     */

    public String getDesString(String strMi) {


        String strMing = "";

        try {

            strMing =  new String(getDesCode(hex2byte(strMi.getBytes())));
            strMing = java.net.URLDecoder.decode(strMing, "UTF-8");

        } catch (Exception e) {

            e.printStackTrace();

        }



        return strMing;

    }

    /**

     * 加密以byte[]明文输入,byte[]密文输出

     */

    private byte[] getEncCode(byte[] byteS) {

        byte[] byteFina = null;

        Cipher cipher;

        try {

            cipher = Cipher.getInstance("DES");

            cipher.init(Cipher.ENCRYPT_MODE, key);

            byteFina = cipher.doFinal(byteS);

        } catch (Exception e) {

            e.printStackTrace();

        } finally {

            cipher = null;
        }

        return byteFina;
    }

    private byte[] getDesCode(byte[] byteD) {

        Cipher cipher;

        byte[] byteFina = null;

        try {

            cipher = Cipher.getInstance("DES");

            cipher.init(Cipher.DECRYPT_MODE, key);

            byteFina = cipher.doFinal(byteD);

        } catch (Exception e) {

            e.printStackTrace();

        } finally {

            cipher = null;

        }

        return byteFina;

    }

    /**
     * 二行制转字符串
     */

    public static String byte2hex(byte[] b) { // 一个字节的数，

        // 转成16进制字符串

        String hs = "";

        String stmp = "";

        for (int n = 0; n < b.length; n++) {

            // 整数转成十六进制表示

            stmp = (Integer.toHexString(b[n] & 0XFF));

            if (stmp.length() == 1)

                hs = hs + "0" + stmp;

            else

                hs = hs + stmp;

        }

        return hs.toUpperCase(); // 转成大写

    }

    public static byte[] hex2byte(byte[] b) {

        if ((b.length % 2) != 0)

            throw new IllegalArgumentException("长度不是偶数");

        byte[] b2 = new byte[b.length / 2];

        for (int n = 0; n < b.length; n += 2) {

            String item = new String(b, n, 2);

            // 两位一组，表示一个字节,把这样表示的16进制字符串，还原成一个进制字节
            b2[n / 2] = (byte) Integer.parseInt(item, 16);

        }

        return b2;

    }

    public String getURLDecoder(String str){
        String retStr="";
        try {
            retStr = java.net.URLDecoder.decode(str, "UTF-8");
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
        return retStr;
    }

    public static void main(String[] args) throws UnsupportedEncodingException {
        String data = "{'sharer':'10001'，'topBroker':'90004' ,'juniorBroker':'90005'}";
//		String srcstr= MD5.getMD5(data.getBytes()) ;//"501ff9b4baffd6efe79d5bc76e43555f";

        DesTool des = new DesTool();//实例化一个对像
        des.setKey("501ff9b4baffd6efe79d5bc76e43555f");// 私钥

        System.err.println("des.key: "+des.keyStr);
        String strEnc = des.getEncString(data);//加密

        System.out.println("加密串 : "+strEnc);


//		System.out.println("原文   "+srcstr);
        String strDes = des.getDesString(strEnc);//解密
        System.out.println("解密串 : "+strDes);
    }

}
